package com.pro.api;

import com.alibaba.fastjson.JSON;
import com.pro.VO.UserInfoVo;
import com.pro.bean.UserInfo;
import com.pro.dto.Dto;
import com.pro.service.UserInfoService;
import com.pro.util.dtoUtil.DtoUtil;
import com.pro.util.redisUtil.RedisUtil;
import com.pro.util.tokenUtil.TokenUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;
/**
 * 提供前端接口，供前端访问
 *当前类为UserInfo控制层
 **/
@RestController
@RequestMapping("userInfo")
public class UserInfoController {
    //注入服务层
    @Autowired
    private UserInfoService userInfoService;

    //注入token工具类
    @Autowired
    private TokenUtil tokenUtil;

    //注入redis数据库工具类'
    @Autowired
    private RedisUtil redisUtil;

    /**
     * 查询数据表中所有数据
     * 返回：多条数据List<UserInfo>
     * **/
    @GetMapping(value = "all")
    public List<UserInfo> all(){
        return userInfoService.all();
    }

    /**
     *
     * 登录功能
     *
     */
    @PostMapping(value = "login")
    public Dto login(@RequestBody UserInfo userInfo, HttpServletRequest request) throws IOException {
        //通过前端传输过来的用户名查询数据库，返回UserInfo对象
        UserInfo u = userInfoService.login(userInfo.getUserName());
        if(!(u==null)){
            //进入该方法区域说明用户名存在
            if(userInfo.getPassword().equals(u.getPassword())){
                //进入该方法区域说明密码正确，判断登录成功

                //根据request请求中的header取出user-agent作为生成token的原料
                String agent = request.getHeader("user-agent");
                //调用tokenUtil类中的方法根据原料动态生成token
                String token = tokenUtil.token(agent,userInfo.getUserName());

                //由于前端不能存储用户名密码，所以在这将它设置为null，再返回
                u.setPassword("");

                //将生成的token存储到Redis数据库中，以便之后的处理
                redisUtil.setStr(token, JSON.toJSONString(token));

                UserInfoVo vo = new UserInfoVo();
                vo.setData(u);
                vo.setToken(token);

                //返回成功的数据到前端
                return DtoUtil.returnSuccess(vo);
            }else{
                //进入该方法区域说明密码错误

                //返回错误信息
                return DtoUtil.returnError(5001,"密码输入错误");
            }
        }else{
            //进入该方法区域说明用户名不存在

            return DtoUtil.returnError(5001,"用户名输入错误");
        }
    }
    /**
     *
     * 注册功能
     * 返回值：DTO
     *
     * */
    @PostMapping(value="add")
    public Dto add(@RequestBody UserInfo userInfo) {
        //通过前端传输过来的用户名查询数据库,是否有该用户数据
        String userName = userInfoService.selName(userInfo.getUserName());
        if (userName!=null) {//如果userName不为null，说明数据库有用户名，不能注册
            return DtoUtil.returnError(5002, "用户名重复，注册失败");
        }else {
            //进入else说明数据库没有用户名，可注册
            //根据add()方法返回值进行判断，如果返回为1则为注册成功
            int isUser = userInfoService.add(userInfo);
            if (isUser==1){
                return DtoUtil.returnSuccess("用户注册成功");
            }else{
                return DtoUtil.returnError(5004,"注册失败");
            }
        }
    }
    //积分
    @GetMapping(value = "integral")
    public Dto integral(int userId){
        return DtoUtil.returnSuccess(userInfoService.integral(userId));
    }

    //余额
    @PostMapping(value = "upBalance")
    public Dto upBalance(Double balance, int id){
        return DtoUtil.returnSuccess(userInfoService.upBalance(balance,id));
    }



}


